package com.et114.core.resources;

import java.text.MessageFormat;
import java.util.*;

/**
 * 消息文本管理器
 * @author guanhw
 * @since
 */
public class MessageManager
{
	private ResourceBundle bundle;

	private MessageManager( String fileName ) {
		this( fileName, Locale.getDefault() );
	}

	private MessageManager( String fileName, Locale loc ) {
		try {
			bundle = ResourceBundle.getBundle( fileName, loc, this.getClass().getClassLoader() );
		} catch( MissingResourceException ex ) {
			bundle = ResourceBundle.getBundle( fileName, Locale.US, this.getClass().getClassLoader());
		}
	}

	private MessageManager( ResourceBundle bundle ) {
		this.bundle = bundle;
	}

	/**
	 * 从资源束中按键值取消息文本串
	 *@param key 键值
	 */
	public String getMessage( String key ) {
		if ( key == null )
			throw new IllegalArgumentException( "key may not be a null value" );
		String msg = null;
		try {
			msg = bundle.getString( key );
		} catch( MissingResourceException e ) {
		}
		return msg;
	}

	/**
	 * 从资源束中按键值取消息文件串，并用指定的参数进行格式化
	 *@param key 键值
	 *@param args 参数
	 */
	public String getMessage( String key, Object[] args ) {
		String value = getMessage( key );
		try {
			if( args == null )
				return value;
			return MessageFormat.format( value, args );
		} catch( IllegalArgumentException e ) {
			StringBuffer buf = new StringBuffer(64);
			buf.append( value );
			buf.append( '\n' );
			for(int i = 0; i < args.length; i ++ ) {
				if ( i > 0 )
					buf.append( ',' );
				buf.append( "arg[" ).append( i ).append( "]=" ).append( args[i] );
			}
			throw new IllegalArgumentException( buf.toString() );
		}
	}

	/**
	 * 从资源束中按键值取消息文件串，并用指定的参数进行格式化
	 *@param key 键值
	 *@param args1 第一个参数
	 */
	public String getMessage( String key, Object arg1 ) {
		return getMessage( key, new Object[]{ arg1 } );
	}

	/**
	 * 从资源束中按键值取消息文件串，并用指定的参数进行格式化
	 *@param key 键值
	 *@param args1 第一个参数
	 *@param args2 第二个参数
	 */
	public String getMessage( String key, Object arg1, Object arg2 ) {
		return getMessage( key, new Object[]{ arg1, arg2 } );
	}

	/**
	 * 从资源束中按键值取消息文件串，并用指定的参数进行格式化
	 *@param key 键值
	 *@param args1 第一个参数
	 *@param args2 第二个参数
	 *@param args3 第三个参数
	 */
	public String getMessage( String key, Object arg1, Object arg2, Object arg3 ) {
		return getMessage( key, new Object[]{ arg1, arg2, arg3 } );
	}

	/**
	 * 从资源束中按键值取消息文件串，并用指定的参数进行格式化
	 *@param key 键值
	 *@param args1 第一个参数
	 *@param args2 第二个参数
	 *@param args3 第三个参数
	 *@param args4 第四个参数
	 */
	public String getMessage( String key, Object arg1, Object arg2, Object arg3, Object arg4 ) {
		return getMessage( key, new Object[]{ arg1, arg2, arg3, arg4  } );
	}

	/**
	 * 从资源束中按键值取消息文件串，并用指定的参数进行格式化
	 *@param key 键值
	 *@param args1 第一个参数
	 *@param args2 第二个参数
	 *@param args3 第三个参数
	 *@param args4 第四个参数
	 *@param args5 第五个参数
	 */
	public String getMessage( String key, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5 ) {
		return getMessage( key, new Object[]{ arg1, arg2, arg3, arg4, arg5 } );
	}

	/**
	 * 从资源束中按键值取消息文件串，并用指定的参数进行格式化
	 *@param key 键值
	 *@param args1 第一个参数
	 *@param args2 第二个参数
	 *@param args3 第三个参数
	 *@param args4 第四个参数
	 *@param args5 第五个参数
	 *@param args6 第六个参数
	 */
	public String getMessage( String key, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6 ) {
		return getMessage( key, new Object[]{ arg1, arg2, arg3, arg4, arg5, arg6 } );
	}

	private static Hashtable mgrs = new Hashtable();

	/**
	 * 取指定文件的消息文本管理器
	 *@param fileName 文件名
	 */
	public synchronized static MessageManager getManager( String fileName ) {
		MessageManager mgr = (MessageManager)mgrs.get( fileName );
		if (mgr == null) {
			mgr = new MessageManager( fileName );
			mgrs.put( fileName, mgr );
		}
		return mgr;
	}

	/**
	 * 取指定资源束的消息文本管理器
	 *@param bundle 资源束
	 */
	public synchronized static MessageManager getManager( ResourceBundle bundle ) {
		return new MessageManager( bundle );
	}

	/**
	 * 取指定包指定区域的消息文本管理器
	 *@param fileName 文件名
	 *@param loc 区域
	 */
	public synchronized static MessageManager getManager( String fileName, Locale loc ) {
		String bundleName = fileName + "_" + loc.toString();
		MessageManager mgr = (MessageManager)mgrs.get( bundleName );
		if (mgr == null) {
			mgr = new MessageManager( fileName, loc );
			mgrs.put( bundleName, mgr);
		}
		return mgr;
	}
}
